package com.example.okhttp;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Okhttp源码解析
 * 1.创建OkhttpClient.Buider():里面初始化一些重要属性
 * dispatcher调度器：三个任务队列(正在运行的同步任务队列/正在运行异步任务队列/准备执行异步任务队列)+线程池
 * connectionPool：连接池，网络连接可以进行复用，最多5个，每个链接最终保持5分钟
 * connectTimeOut/readTimeOut/wriiteTimeOut：默认十秒
 * 2.创建request对象：url网址/请求方式默认是get/请求头/请求体/tag
 * 3.client发起request得到RealCall
 * 4.同步和异步：
 * 同步：execute()方法：调用dispatcher调度器将RealCall放在正在运行的同步任务队列中
 * 异步：enqueue()方法：调用dispatcher调度器new AsyncCall，判断正在执行的异步任务队列是否超过最大requet数量64，若超过将AsyncCall放在准备异步任务队列，若没超过将AsyncCall放在正在异步任务队列中并交给线程池执行该任务
 *
 * 5.无论是同步还是异步都会执行getResponseWithInterceptorChain()获得最终的response结果
 * （1）里面7种拦截器：自定义Inteceptor—》重连和重定向拦截器—〉桥拦截器(gZip)—>缓存拦截器—>链接拦截器->自定义NetWorkInteceptor-》CallServerInteceptor真正发送数据和读取数据
 * （2）将7种拦截封装在责任链中，最后执行得到response结果
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        //1.client对象
        OkHttpClient client = new OkHttpClient.Builder()
//                .addInterceptor()
//                .addNetworkInterceptor()
                .build();
        //2.request对象
        Request request = new Request.Builder()
                .get()
                .url("")
                .addHeader("token", "")
                .build();


        //3.client发起请求得到call对象
        Call call = client.newCall(request);

        //4.异步请求/同步请求 ----》response
        //异步请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {

            }
        });
        //同步请求
        try {
            Response response = call.execute();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }


    }
}